#include <iostream>
#include <signal.h>
#include <unistd.h>
#include <assert.h>
using namespace std;

//void handler(int signo)
//{
//    //信号抵达中，检查pendin表
//    cout << "get a signal, signal : " << signo << endl;
//    sigset_t s;
//    sigemptyset(&s);
//    while(true)
//    {
//        sigpending(&s);
//        for (int i = 31; i >= 1; i--)
//        {
//            if(sigismember(&s, i))
//                putchar('1');
//            else
//                putchar('0');
//        }
//        putchar('\n');
//        sleep(1);
//    }
//}
//
//int main()
//{
//    signal(2, handler);
//    cout << "pid : " << getpid() << endl;
//    while(true)
//        sleep(1);
//    return 0;
//}



 void handler(int signo)
 {
     cout << "get a signal, signo : " << signo << endl;
    sigset_t s;
    sigemptyset(&s);
    while (true)
    {
        cout << "pending set : ";
        sigpending(&s);
        for (int i = 31; i >= 1; i--)
        {
            if(sigismember(&s, i))
                cout << '1';
            else
                cout << '0';
        }
        cout << endl;
        sleep(1);
    }
}

int main()
{
    cout << "pid : " << getpid() << endl;
    struct sigaction act, oact;
    act.sa_handler = handler;
    act.sa_flags = 0;
    sigemptyset(&act.sa_mask);
    sigaddset(&act.sa_mask, 3);
    sigaddset(&act.sa_mask, 4);
    sigaddset(&act.sa_mask, 5);

    //信号抵达处理时，阻塞该信号
    int n = sigaction(2, &act, &oact);
    assert(n == 0);

    while (true)
        sleep(1);
    return 0;
}
